package users

import (
	"encoding/json"
	"errors"

	"gitee.com/xgotool/backend-framework-template/config"
	"gitee.com/xgotool/backend-framework-template/model"
)

// 获取用户的角色菜单ID列表
//
//	uid	待获取的用户ID
func MenuId(uid uint) ([]uint, error) {
	if uid == 0 {
		return nil, errors.New("未登录")
	}
	conn, err := config.GetConnect()
	if err != nil {
		return nil, err
	}
	if uid == 1 {
		// 超级用户，直接返回目前所有的菜单ID列表
		menus := []uint{}
		mod := model.Menu{}
		err = conn.Table(mod.TableName()).
			Where("status", 1). // 正常状态
			Pluck("id", &menus).
			Error
		if err != nil {
			return nil, err
		}
		if len(menus) == 0 {
			return nil, errors.New("没有菜单数据")
		}
		return menus, nil
	}
	user := model.User{}
	err = conn.Table(user.TableName()).Select("role_list").First(&user, uid).Error
	if err != nil {
		return nil, err
	}
	// 解析角色ID列表
	json.Unmarshal([]byte(user.RoleList), &user.RoleIds)
	if uid > 1 && len(user.RoleIds) == 0 {
		return nil, errors.New("用户没有角色")
	}
	// 根据角色ID查询菜单ID列表
	role, roles := model.Role{}, []model.Role{}
	err = conn.Table(role.TableName()).Select("role_menu").Find(&roles, user.RoleIds).Error
	if err != nil {
		return nil, err
	}
	// 解析角色ID对应的菜单ID列表
	menuIds := []uint{}
	for _, r := range roles {
		json.Unmarshal([]byte(r.RoleMenu), &menuIds)
		for _, v := range menuIds {
			if v > 0 {
				menuIds = append(menuIds, v)
			}
		}
	}
	if len(menuIds) == 0 {
		return nil, errors.New("用户没有菜单权限")
	}
	return menuIds, nil
}
